package com.yunhe.abnormal.service.base;

import com.yunhe.abnormal.consts.AlarmConsts;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import com.yunhe.common.model.authority.UserDTO;
import com.yunhe.common.model.base.AlarmNotifyConfigDTO;
import com.yunhe.common.model.base.AlarmSmsConfigDTO;
import com.yunhe.common.model.data.AlarmEventDTO;

import java.util.List;

/**
 * 异常通知配置Service
 * @author liuronglei
 */
public interface AlarmNotifyConfigService {

    /**
     * 新增异常通知配置对象
     * @param alarmNotifyConfig 异常通知配置对象
     */
    AlarmNotifyConfigDTO create(AlarmNotifyConfigDTO alarmNotifyConfig) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 批量新增异常通知配置对象
     * @param alarmNotifyConfigs 异常通知配置对象
     */
    List<AlarmNotifyConfigDTO> create(List<AlarmNotifyConfigDTO> alarmNotifyConfigs) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID删除异常通知配置对象
     * @param id 对象ID
     */
    void deleteById(Long id);

    /**
     * 根据ID列表批量删除异常通知配置对象
     * @param ids 对象ID列表
     */
    void batchDelete(List<Long> ids);

    /**
     * 根据用户ID删除异常通知配置
     * @param userId 用户ID
     */
    void deleteByUserId(Long userId);

    /**
     * 根据单位ID删除异常通知配置
     * @param firmId 单位ID
     */
    void deleteByFirmId(Long firmId);

    /**
     * 根据ID获得异常通知配置对象
     * @param id 对象ID
     */
    AlarmNotifyConfigDTO findById(Long id);

    /**
     * 更新异常通知配置对象状态
     * @param id 对象ID
     * @param status 状态
     */
    AlarmNotifyConfigDTO updateStatus(Long id, Integer status) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 更新异常通知配置对象是否全部电站
     * @param id 对象ID
     * @param isAllStation 是否全部电站
     */
    AlarmNotifyConfigDTO updateIsAllStation(Long id, Boolean isAllStation) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 更新异常通知配置对象电站
     * @param id 对象ID
     * @param stationIds 适用电站ID列表
     */
    AlarmNotifyConfigDTO updateStation(Long id, List<Long> stationIds) throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据条件获得异常通知配置列表
     * @param type 类型
     * @param alarmLevelId 异常级别ID
     * @param alarmNotifyTypeName 异常通知类型name
     * @param firmId 单位ID
     * @param userId 用户ID
     */
    List<AlarmNotifyConfigDTO> search(Integer type, Long alarmLevelId, String alarmNotifyTypeName, Long firmId, Long userId);

    /**
     * 根据ID条件获得异常通知短信配置列表
     * @param id 对象ID
     */
    List<AlarmSmsConfigDTO> searchSmsConfig(Long id);

    /**
     * 更新异常短信接收人配置
     * @param id 异常短信接收人配置ID
     * @param alarmSmsConfigs 异常短信接收人配置
     */
    void updateSmsConfig(Long id, List<AlarmSmsConfigDTO> alarmSmsConfigs);



    /**
     * 根据通知配置判断是否需要发送
     * @param alarmEvent 异常事件
     * @param alarmNotifyTypeEnum 异常通知类型
     * @param userId 用户ID
     * @param firmId 运营商ID
     */
    boolean needNotifyByUser(AlarmEventDTO alarmEvent,
                             AlarmConsts.AlarmNotifyType alarmNotifyTypeEnum,
                             Long userId,
                             Long firmId);

    /**
     * 根据运营商通知配置判断哪些用户需要发送
     * @param alarmEvent 异常事件
     */
    List<UserDTO> needNotifyByEvent(AlarmEventDTO alarmEvent);

}
